﻿using System;

namespace LoopApplication
{
    /*
     C# 提供了以下几种循环类型。点击链接查看每个类型的细节。
        while           当给定条件为真时，重复语句或语句组。它会在执行循环主体之前测试条件。
        for/foreach     多次执行一个语句序列，简化管理循环变量的代码。
        do...while      除了它是在循环主体结尾测试条件外，其他与 while 语句类似。
        嵌套循环        可以在 while、for 或 do..while 循环内使用一个或多个循环。
     循环控制语句 循环控制语句更改执行的正常序列。当执行离开一个范围时，所有在该范围中创建的自动对象都会被销毁。
        brack           终止 loop 或 switch 语句，程序流将继续执行紧接着 loop 或 switch 的下一条语句。
        continue        跳过本轮循环，开始下一轮循环。
     */
    class Operator1
    {
        /*
         只要给定的条件为真，C# 中的 while 循环语句会重复执行一个目标语句。
         语法：
            while (condition)
            {
                statement (s);
            }
         */
        static void op1() {
            /* 局部变量定义 */
            int a = 10;

            /* while 循环执行 */
            while (a < 20)
            {
                Console.WriteLine("a 的值： {0}", a);
                a++;
            }
            Console.ReadLine();
        }
    }

    class Operator2
    {
        /*
         一个 for 循环是一个允许您编写一个执行特定次数的循环的重复控制结构。
         语法：
            for ( init; condition; increment)
            {
                statement(s);
            }
         */
        static void op1()
        {
            /* for 循环执行 */
            for (int a = 10; a < 20; a = a + 1)
            {
                Console.WriteLine("a 的值： {0}", a);
            }
            Console.ReadLine();
        }
        /*
         C# 也支持 foreach 循环，使用 foreach 可以迭代数组或者一个集合对象。
         C# 的 foreach 循环可以用来遍历集合类型，例如数组、列表、字典等。它是一个简化版的 for 循环，使得代码更加简洁易读。
         语法：
            foreach (var item in collection)
            {
            
            } 
         */
        static void op2() 
        {
            int[] fibarray = new int[] { 0, 1, 1, 2, 3, 5, 8, 13 };
            foreach (int element in fibarray)
            {
                System.Console.WriteLine(element);
            }
            System.Console.WriteLine();


            // 类似 foreach 循环
            for (int i = 0; i < fibarray.Length; i++)
            {
                System.Console.WriteLine(fibarray[i]);
            }
            System.Console.WriteLine();


            // 设置集合中元素的计算器
            int count = 0;
            foreach (int element in fibarray)
            {
                count += 1;
                System.Console.WriteLine("Element #{0}: {1}", count, element);
            }
            System.Console.WriteLine("Number of elements in the array: {0}", count);
        }
    }

    class Operator3
    {
        /*
         不像 for 和 while 循环，它们是在循环头部测试循环条件。do...while 循环是在循环的尾部检查它的条件。
         do...while 循环与 while 循环类似，但是 do...while 循环会确保至少执行一次循环。
         语法:
            do
            {
                statement(s);
            } while (condition);
         */
        static void op1()
        {
            int a = 10;

            /* do 循环执行 */
            do
            {
                Console.WriteLine("a 的值： {0}", a);
                a = a + 1;
            } while (a < 20);

            Console.ReadLine();
        }
    }

    class Operator4
    {
        /*
         C# 允许在一个循环内使用另一个循环
         语法:
            嵌套for:
                for (init; condition; increment )
                {
                   for ( init; condition; increment )
                   {
                        statement(s);
                   }
                   statement(s);
                }
            嵌套while:
                while (condition)
                {
                    while (condition)
                    {
                        statement(s);
                    }
                    statement(s);
                }
            嵌套do...while:
                do
                {
                    statement(s);
                    do
                    {   
                        statement(s);
                    } while (condition);
                } while(condition);
         */
        static void op1()
        {
            /* 局部变量定义 */
            int i, j;

            for (i = 2; i < 100; i++)
            {
                for (j = 2; j <= (i / j); j++)
                    if ((i % j) == 0) break; // 如果找到，则不是质数
                if (j > (i / j))
                    Console.WriteLine("{0} 是质数", i);
            }

            Console.ReadLine();
        }
    }

    class Operator5
    {
        /*
         C# 中 break 语句有以下两种用法：
             当 break 语句出现在一个循环内时，循环会立即终止，且程序流将继续执行紧接着循环的下一条语句。
             它可用于终止 switch 语句中的一个 case。
             如果您使用的是嵌套循环（即一个循环内嵌套另一个循环），break 语句会停止执行最内层的循环，然后开始执行该块之后的下一行代码。
         */
        static void op1()
        {
            /* 局部变量定义 */
            int a = 10;

            /* while 循环执行 */
            while (a < 20)
            {
                Console.WriteLine("a 的值： {0}", a);
                a++;
                if (a > 15)
                {
                    /* 使用 break 语句终止 loop */
                    break;
                }
            }
            Console.ReadLine();
        }
    }

    class Operator6
    {
        /*
         C# 中的 continue 语句有点像 break 语句。但它不是强迫终止，continue 会跳过当前循环中的代码，强迫开始下一次循环。
         对于 for 循环，continue 语句会导致执行条件测试和循环增量部分。
         对于 while 和 do...while 循环，continue 语句会导致程序控制回到条件测试上。
         */
        static void op1()
        {
            /* 局部变量定义 */
            int a = 10;

            /* do 循环执行 */
            do
            {
                if (a == 15)
                {
                    /* 跳过迭代 */
                    a = a + 1;
                    continue;
                }
                Console.WriteLine("a 的值： {0}", a);
                a++;

            } while (a < 20);

            Console.ReadLine();
        }
    }
}